// 创建用户相关的小仓库
import {defineStore} from 'pinia'
// 引入接口
import {reqLogin,reqUserInfo,reqLogout} from '@/api/user'
// 引入数据类型
import type {loginFormData,loginResponseData,userInfoResponseData} from '@/api/user/type.ts'
import type{UserState} from './types/type'
// 引入操作本地存储的工具方法
import {SET_TOKEN,GET_TOKEN,ROMOVE_TOKEN} from '@/utils/token'

// 引入路由(常量路由)
// @ts-ignore
import {constantRoute,asyncRoute,anyRoute} from '@/router/routes'

// 引入深拷贝方法
import cloneDeep from 'lodash/fp/cloneDeep'

import router from '@/router'

// 用于过滤当前用户需要展示的异步路由
function filterAsyncRoute(asyncRoute:any,routes:any){
  return asyncRoute.filter((item:any)=>{
    if(routes.includes(item.name)){
      if(item.children&&item.children.length>0){
        item.children = filterAsyncRoute(item.children,routes)
      }
      return true
    }
  })
}

// 创建用户小仓库
let useUserStore = defineStore('User',{
  // 小仓库存储数据的地方
  state:():UserState=>{
    return {
      // token:localStorage.getItem('TOKEN'), //用户的唯一标识token
      token:GET_TOKEN(),
      menuRoutes:constantRoute,  //仓库存储菜单生成菜单需要数组(路由)
      username:'',
      avatar:'',
      // 存储当前用户是否包含某一个按钮
      buttons:[]
    }
  },
  // 处理异步|逻辑的地方
  actions:{
    // 用户登录的方法
    async userLogin(data:loginFormData){
      // 登录请求
      let result:loginResponseData = await reqLogin(data)
      // console.log(result)
      // console.log(result)
      // 登录请求：成功200->token
      // 登录请求：失败201->登录失败的错误信息
      if(result.code==200){
        // 通过pinia仓库存储一下token
        // 由于pinia|vuex存储数据其实利用的是js对象
        //           断言
        this.token = (result.data as string)
        // 本地持久化存储
        // localStorage.setItem('TOKEN',(result.data.token as string))
        SET_TOKEN((result.data as string))
        
        //能保证当前async函数返回一个成功的promise
        return 'ok'
      }else{
        return Promise.reject(new Error(result.data))
      }
    },
    // 获取用户信息方法
    async userInfo(){
      // 获取用户信息进行存储仓库当中[用户头像、名字]
      let result:userInfoResponseData = await reqUserInfo()
      // console.log(result.data.routes)
      // 如果获取用户信息成功，存储一下用户信息
      if(result.code==200){
        this.username = result.data.name
        this.avatar = result.data.avatar
        this.buttons = result.data.buttons
        // 计算当前用户需要展示的异步路由
        let userAsyncRoute = filterAsyncRoute(cloneDeep(asyncRoute),result.data.routes)
        // 菜单需要的数据整理完毕
        this.menuRoutes = [...constantRoute,...userAsyncRoute,...anyRoute];
        // console.log(router.getRoutes())
        // 目前路由器管理的只有常量路由：用户计算完毕异步路由、任意路由动态追加
        [...userAsyncRoute ,anyRoute].forEach((route:any)=>{
          router.addRoute(route)
        })
        // 打印当前用户的全部路由
        // console.log(router.getRoutes())
        return 'ok'
      }else{
        return Promise.reject(new Error(result.message))
      }
    },
    // 退出登录
    async userLogout(){
      // 退出登录请求
      let result:any = await reqLogout()
      // console.log(result)
      if(result.code==200){
        // 目前没有mock接口：退出登录接口(通知服务器本次用户唯一标识失效)
        this.token = '',
        this.username = '',
        this.avatar = '',
        ROMOVE_TOKEN()
        return 'ok'
      }else{
        return Promise.reject(new Error(result.message))
      }
      
    }
  },
  getters:{

  }
})

// 对外暴露获取小仓库的方法
export default useUserStore